#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>


typedef struct mouvement mouvement;        //structure de mouvement
struct mouvement
{
    int gauche;        //gauche=1 : il y a un mouvement vers la gauche //gauche=0 : il n'y a pas de mouvement vers la gauche
    int droite;        //droite=1 : il y a un mouvement vers la droite //droite=0 : il n'y a pas de mouvement vers la droite
    int sgauche ;
    int sdroite;
};

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
    //Holds offsets
    SDL_Rect offset;

    //Get offsets
    offset.x = x;
    offset.y = y;

    //Blit
    SDL_BlitSurface( source, NULL, destination, &offset );
}

int main ( int argc, char** argv )
{
	 mouvement mvt_bonhomme;
int z=0 ;

	//Initialisation des structures
    mvt_bonhomme.gauche = 0;
    mvt_bonhomme.droite = 0;
    //Init de la SDL
    SDL_Init( SDL_INIT_VIDEO );

    // On crée une fenêtre
   SDL_Surface* ecran = SDL_SetVideoMode(1000, 610, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
const SDL_VideoInfo* myPointer = SDL_GetVideoInfo();
ecran=SDL_SetVideoMode(myPointer->current_w, myPointer->current_h, myPointer->vfmt->BitsPerPixel,SDL_DOUBLEBUF|SDL_FULLSCREEN);

    // On charge le fond
    SDL_Surface* fond = SDL_LoadBMP("background.bmp");

    //On charge Mario
    SDL_Surface* mario = IMG_Load("1.png");
SDL_Surface* mario1 = IMG_Load("1g.png");
SDL_SetColorKey(mario , (SDL_SRCCOLORKEY | SDL_RLEACCEL), SDL_MapRGB(mario->format,255, 255, 255));
SDL_SetColorKey(mario1 , (SDL_SRCCOLORKEY | SDL_RLEACCEL), SDL_MapRGB(mario1->format,255, 255, 255));

    // La position du fond
   int Xf =0, Yf=0 ;

    // La position de Mario
  int ff=0,ff2=0;
    int Xm = 100;
    int Ym = 600-(mario->h);

 //int xm = 100;
   // int ym = 600-(mario->h);




    // Les variables de la troisieme methode
    double v_x = 1.5;

    double v_grav = 1;
    double v_saut = -20;

    double v_y = 1.5;

    // Boucle principale
    int fin = 0,saut=0,g,d,i=1000 ;
SDL_EnableKeyRepeat(4,4);
    while (!fin)
    {
        // Gestion des evenements
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_QUIT:
                fin = 1;
                break;

            case SDL_KEYDOWN:
                { switch(event.key.keysym.sym)    //On regarde quelle est la touche sur laquelle on a appuyé
	                {

		    case SDLK_RIGHT: 
                        mvt_bonhomme.droite = 1;  
			mvt_bonhomme.sdroite = 1 ;
			mvt_bonhomme.sgauche = 0 ;                 
                        mvt_bonhomme.gauche = 0; 
i++;
			d=1;
			g=0;
			Xf-=5;
if( Xf <=610 -fond->w )
        {
            //Reset the offset
            Xf = 0;
        }

                        break;
                    case SDLK_LEFT: 
                        mvt_bonhomme.gauche = 1;                   
                        mvt_bonhomme.droite = 0; 
			mvt_bonhomme.sdroite = 0 ;
			mvt_bonhomme.sgauche = 1 ;   

i-- ;  
                     
			g=1;
			d=0;			
			   Xf+=5; 

if( Xf <=0 -fond->w )
        {
            //Reset the offset
            Xf = 0;

        }
       
			break;
		    case SDLK_SPACE:
			saut=1;
			break;
case SDLK_ESCAPE:
fin=1;
break ;	
			}

                }
		break;
		case SDL_KEYUP:
                	switch(event.key.keysym.sym)    
                {
                    case SDLK_RIGHT: // La flèche droite est relachée
                        mvt_bonhomme.droite = 0;        //On remet la variable à 0 pour empêcher le déplacement
                        break;
                    case SDLK_LEFT: // La flèche gauche est relachée
                        mvt_bonhomme.gauche = 0;        //On remet la variable à 0 pour empêcher le déplacement
                        break;
                }
                break;
            }
        }



if (mvt_bonhomme.droite== 1)
{

if (i%10==0) { mario = IMG_Load("1.png");}
else if (i%10==1) {mario = IMG_Load("2.png");}
else if  (i%10==2) { mario = IMG_Load("3.png");}
else if  (i%10==3) { mario = IMG_Load("4.png");}
else if  (i%10==4) { mario = IMG_Load("5.png");}
else if  (i%10==5) { mario = IMG_Load("6.png");}
else if  (i%10==6) { mario = IMG_Load("7.png");}
else if  (i%10==7) { mario = IMG_Load("8.png");}
else if  (i%10==8) { mario = IMG_Load("9.png");}
else if  (i%10==9) { mario = IMG_Load("10.png");}
//Xm = Xm+ v_x +v_x;

Xm+=0.1;
}

if (mvt_bonhomme.gauche== 1)
{
if (i%10==9) { mario = IMG_Load("1g.png");}
else if  (i%10==8) { mario = IMG_Load("2g.png");}
else if  (i%10==7) { mario = IMG_Load("3g.png");}
else if  (i%10==6) { mario = IMG_Load("4g.png");}
else if  (i%10==5) { mario = IMG_Load("5g.png");}
else if  (i%10==4) { mario = IMG_Load("6g.png");}
else if  (i%10==3) { mario = IMG_Load("7g.png");}
else if  (i%10==2) { mario = IMG_Load("8g.png");}
else if  (i%10==1) { mario = IMG_Load("9g.png");}
else if  (i%10==0) { mario = IMG_Load("10g.png");}
//Xm = Xm - v_x - v_x;
Xm-=0.1;
}


if (saut==1)
{	
        // EVOLUTION
 //Xm+=2;//////////////////////////////////////////////////////////////////////////////////////////////////////////
            // Evolution des positions : vive la rigueur !
            if (d == 1)
	{
	   // Xm += v_x;
            Ym += v_y;

	}
	else if (g==1) {
//Xm -= v_x;
Ym += v_y;

}
else {Ym += v_y;}
            // evolution de la vitesse verticale
            v_y += v_grav;
	
	    if (Ym > 600-(mario->h))
		{
		d=0;
		g=0;
		saut=0;	
		v_y = v_saut;
                
		}
Xf-=5;
if( Xf <=1000 -fond->w )
        {
            //Reset the offset
            Xf = 0;
//fond = IMG_Load("fond1.jpg");
        }}

        // FIN EVOLUTION

        // DESSIN

       if (saut==1){z=1;}
	if ((Xm-Xf)>=330 && (z==0) ) {Xf+=5 ; }

 SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0));
apply_surface(Xf, Yf, fond, ecran);
apply_surface(Xm, Ym, mario, ecran);
//apply_surface(xm, ym, mario1, ecran);
SDL_Flip(ecran);	
SDL_Delay(7);
}


    // Et on soulage la mémoire !
    SDL_FreeSurface(fond);
    SDL_FreeSurface(mario);
//SDL_FreeSurface(mario1);

    SDL_Quit();

    return 0;
}
